home *** CD-ROM | disk | FTP | other *** search
/ Spanish Scene 1 / SpanishScene1.iso / spanish pack n°1 by llfb / revistas / fanzine / fanzine01.dms / fanzine01.adf / 41 < prev    next >
Text File  |  1990-12-11  |  17KB  |  501 lines

  1.  
  2.  
  3.                                       /\
  4.                                      /  \
  5.                                     /¯¯¯¯\
  6.                                  /\/______\/\
  7.                                 /  \__/\__/  \
  8.  
  9.                      <  A T R A C C I O N   F R A C T A L >
  10.  
  11.  
  12.  
  13.  CAPITULO I: SISTEMAS DE LINDENMAYER
  14.  
  15.  
  16.  (c) Warlord. Marzo 1992
  17.  
  18.  
  19.  Dedicado a Benoit Mandelbrot
  20.  Profesor de Matemáticas de la Universidad de Hardvard
  21.  (Por ser el primero en esto)
  22.  
  23.  IMPORTANTE: Antes de leer este artículo, lee el de introducción a los frac-
  24.  tales, así te enterarás de qué son o para qué sirven.
  25.  
  26.   Si hace unos meses, alguien hubiese escrito  un curso sobre este tema, estar
  27.  seguros que me habría  dado, cuanto  menos, con un canto entre los dientes, y
  28.  la explicación es fácil:  Este  curso es único en su género. Hacer  un  curso
  29.  sobre un lenguaje u otra  cosa, es  más o  menos  adsequible, pues  se  puede
  30.  encontrar documentación sobre el tema y  un esquema claro que seguir. Pero en
  31.  el caso de los fractales, esto no ocurre. Nunca  he escuchado que una revista
  32.  o publicación, incluso entre las más serias, haga siquiera un  artículo sobre
  33.  cómo construir fractales, a lo más, comentar  algún  programa  de paisajes  o
  34.  cosas por el estilo.
  35.  
  36.   Espero  que  comprendáis, lo  difícil  que  es  esto. Uno  no sabe por dónde
  37.  empezar,o de que hablar. Al final me he decidido por empezar por lo más fácil
  38.  De todos modos, si alguien necesitara  algo  más  complejo, o  queréis  hacer
  39.  alguna pregunta, ya sabéis: Apdo 232, San Fernando 11100, Cádiz.
  40.  
  41.   Quiero advertiros, que soy  un simple  aficcionado al tema, y ni mucho menos
  42.  soy un experto, pues entre otras cosas, estoy aprendiendo ahora. Si alguno de
  43.  los  que  lean  esto, conocen  algo  sobre fractales, espero  que me escriban
  44.  inmediatamente, ¡ya!, ¡¡ya!!.
  45.  
  46.  * Libros DIVULGATIVOS (sólo superficiales) de fractales,publicados en España:
  47.  
  48.  - Caos, por David o Zelnick. Editorial ???. Precio: Unas 2500 pts
  49.  - El mundo fractal. B. Mandelbrot, Ed. Tusquetes. Precio: Unas 1500 pts.
  50.  - Varios más que no recuerdo...
  51.  
  52.  Si queréis comprar alguno, quizás el segundo sea mejor. Pero no olvides que
  53.  sólo son superficiales.
  54.  
  55.  * Libros SERIOS de fractales, publicados en Español:
  56.  
  57.                                   NINGUNO
  58.  
  59.  * Libros SERIOS en Inglés que puedes buscar en España:
  60.  
  61.  Con algo de suerte, no es difícil encontrar el libro:
  62.  
  63.                          FRACTAL PROGRAMING IN C
  64.  
  65.  así como su edición avanzada. Con mucha suerte, y sólo en grandes librerias,
  66.  podréis encontrar alguno más.
  67.  
  68.  
  69.   La única forma de comprar algún otro, es escribir  directamente a alguna
  70.  editorial. Concretamente, la Springer-Verlag dispone de excelentes libros
  71.  sobre esto. Su dirección es:
  72.  
  73.                           Springer - Verlag N.Y.
  74.                            175 Fifth Avenue
  75.                           New York, NY 10010
  76.                                U.S.A.
  77.  
  78.   El precio de estos libros varía entre 7000 y 15.000 pts
  79.  También la editorial Academic Press tiene muy buenos libros, aunque de un
  80.  nivel muy elevado. Para aquellos con buenos conocimientos de Matemáticas
  81.  (entiéndase de Topología y funciones complejas, el mejor es "  Fractals
  82.  everywhere", de esta última editorial.
  83.  
  84.   Por último os advertiré que al final de cada artículo incluire algunas 
  85.  nociones de matemáticas fundamentales para este cursillo. Intentaré  ir
  86.  incluyendo las rutinas en C, de  forma  que  sean  rutinas  fáciles  de
  87.  entender y de adaptar, ya sea a ensamblador o a un lenguaje de alto nivel.
  88.  
  89.  Y sin más preámbulos ....   ¡Ahí ván!...
  90.  
  91.  SISTEMAS DE LINDENMAYER (L- SYSTEMS):
  92.  ====================================
  93.  
  94.   Fueron desarrollados por  Aristid Lindermayer, para la representación de
  95.  la estructura de  las plantas. Bajo  el nombre de L-sistemas, se esconden
  96.  numerosas  representaciones  de los  fractales, más o menos complejas.
  97.   Comenzaremos  con el  más importante, y a partir del cual se derivan los
  98.  demás
  99.  
  100.  SISTEMAS DOL:
  101.  ------------
  102.  
  103.  (Sistemas OL-Determinísticos)
  104.  
  105.  
  106.   ¡Atención!, ESTO es un fractal:
  107.  
  108.   #define d 13
  109.   #define e 3
  110.   #define m 2
  111.   #define n 3
  112.   #define u 1
  113.   #define v 1
  114.  
  115.   w  :   S(0)a(1,0)
  116.   p1 :          a(t,c):t<m              ----->a(t+1,c)
  117.   p2 :          a(t,c):(t=m)&(c<e)      ----->I(0,u)[L]a(1,c+1)
  118.   p3 :          a(t,c):(t=m)&(c=e)      ----->I(0,u)[L][b(1)]a(1,c)
  119.   p4 :          b(t)  :t<n              ----->b(t+1)
  120.   p5 :          b(t)  :t=n              ----->I(0,v)[L]b(1)
  121.   p6 :          S(t)  :*                ----->S(t+1)
  122.   p7 :   S(t) < I(i,j):t=d              ----->I(i,j)
  123.   p8 :          I(i,j):(0<i)&(i<j)      ----->I(i+1,j)
  124.   p9 :   I(i,j)<I(k,l):(i=j)&(k=0)      ----->I(1,l)
  125.   p10:   I(i,j)<a(k,l):i>0              ----->I[L][b(1)]B
  126.   p11:   I(i,j)<b(k)  :i>0              ----->I[L]B
  127.   p12:          B     :*                ----->I[K]B
  128.   
  129.   END.  
  130.  
  131.   ¡¡ Un momento!!, ¡que nó cunda el pánico! .... ¡volved!. Esto no es necesa-
  132.  rio que lo comprendáis (¡aún!), pero... ¿a que a sido un buen pegote?
  133.  
  134.   Para los "viejos carrozas informáticos", en cuanto  os diga de qué va esto,
  135.  enseguida recordaréis un lenguaje, tan querido como olvidadado : ¡EL LOGO!.
  136.  ¡Un momento!, ¡esto no significa que haya que saber Logo o que vaya a hacer
  137.  otro de mis cursos-rollos! (pero no creáis que no me gustaría ... Je,je,je).
  138.  El Logo es ya un lenguaje que pasó a la historia hace  ya muchos años, y que
  139.  hoy en día no tiene ninguna utilidad.
  140.  
  141.  Ahora, para comenzar de una forma bonita y divertida, dibujemos un fractal.
  142.  Es el llamado "snowflake" de Von Koch (1905)
  143.  
  144.  ATENCION:
  145.  
  146.   - Un fractal comienza siempre con una semilla o iniciador, denotada por w.
  147.   - A continuación, van una serie de pasos, denotados por p1, p2.... Se
  148.     aplican uno detrás de otro. Una vez acabados, le fractal ha sido dibujado.
  149.   - Si el paso, es siempre el mismo, se denota por "p" y se llama "generador".
  150.     La orden dada por el paso "p" se aplica un cierto número de veces (los 
  151.     que  uno quiera). Generalmente 4 ó  5. Teóricamente  se  pueden  aplicar
  152.     infinitas veces, en la práctica, como por ejemplo, a la hora de hacer una
  153.     demo, la limitada resolución de nuestra pantalla no nos permite mucho más
  154.     allà de 3 pasos o iteraciones.
  155.   - a-->b significa que donde halla "a", quitarla y poner "b"
  156.  
  157.  Snowflake de Van Koch:
  158.  
  159.  w : Cuadrado
  160.  p : linea -------> linea+triangulo+linea (ed, sustituir línea por figura p)
  161.  
  162.  w: Dibujamos un cuadrado
  163.        _________________
  164.  w=   |                 |
  165.       |                 |     p=           /\
  166.       |                 |         ________/  \________
  167.       |                 |
  168.       |                 |
  169.       |                 |
  170.       |_________________|
  171.  
  172.           INICIADOR                  GENERADOR
  173.  
  174.   En el primer paso, sustituimos las cuatro lineas rectas del cuadrado por p.
  175.   Obtenemos:
  176.  
  177.             /\
  178.       _____/  \______
  179.      |               |       No está muy bien dibujado, pero si lo pintais
  180.      |               |       bien, podréis verlo mucho mejor.Obtenemos una
  181.     /                 \      especie de estrella con 16 líneas rectas (con-
  182.    /                   \     tar todas las líneas,4 por lado:
  183.    \                   /           1     2/\3
  184.     \                 /         _________/  \_______4
  185.      |               |
  186.      |_____    ______|
  187.            \  /
  188.             \/
  189.  
  190.    En cada una de estas 16 líneas metemos la figura p de nuevo. Si lo hacéis 4
  191.  o más veces, obtendréis un maravilloso fractal.
  192.  
  193.   Si habéis leido el artículo de introducción os preguntaréis, ¿y que pasa con
  194.  el rollo de la dimensión fraccional?. Sabed,  que si esto  se hace  un número
  195.  infinito de veces, las figuras "cambian de dimensión" (mas o menos).
  196.  
  197.   Otro ejemplo menos geométrico:
  198.  
  199.   w: a
  200.   p: a ----> ab
  201.  
  202.      Resultado:
  203.  
  204.         a        paso 0: escibimos la semilla w
  205.         ab       paso 1: sustituimos "a" por ab
  206.         abb      paso 2:   ""         ""  ""  ""
  207.         abbb     etc....
  208.         abbbb
  209.         (etc...)
  210.  
  211.  
  212.    Una vieja amiga: La tortuga
  213.    ---------------------------
  214.  
  215.    Para los que no lo sepan, la tortuga era un triángulo que  desplazábamos
  216.  por la pantalla  en el lenguaje Logo, para dibujar. Se  guiaba con órdenes
  217.  del siguiente tipo:
  218.  
  219.  adelante y dibuja 10 (la "tortuga" se movia 10 pixels para delante, dibujan
  220.                        do una línea)
  221.   girar derecha 90     (la tortuga giraba 90 grados a la derecha)
  222.   atrás y no dibujar 3 (se mueve hacia atrás 3 pixels pero no dibuja nada)
  223.  
  224.   etc...
  225.  
  226.   la tortuga, venía pues definida por 3 variables: (x,y,a).
  227.  
  228.   x = Posición horizontal en pantalla.
  229.   y = Posición vertical en pantalla.
  230.   a = ángulo de la nariz de la tortuga.
  231.  
  232.    De ahora en adelante, utilizaremos una tortuga (eso sí, muy rápida)....
  233.  bueno, utilizaremos una Turbo-tortuga para que dibuje nuestros fractales.
  234.  Los comandos básicos (por el momento), serán:
  235.  
  236.  F : Mover adelante d posiciones y dibujar una línea. Ahora, la nueva posición
  237.      de la tortuga es:
  238.  
  239.      x' = x+d*cos(a)
  240.      y' = y+d*sen(a)
  241.      el ángulo no varía
  242.  
  243.  f : Igual que la anterior, pero sin dibujar línea.
  244.  
  245.  + : Girar un ángulo "s" a la izqda de a grados. La posición no varía pero el
  246.      ángulo sí:
  247.  
  248.      a' = a+s
  249.  
  250.  - : Igual pero a la izqda:  a' = a-s
  251.  
  252.  Nota: los valores de "d" y "s" se definen al principio del programa.
  253.  
  254.  Veamos otro Fractal:
  255.  
  256.  w: F - F - F - F -
  257.  p: F ----> F - F + F + F F - F - F + F
  258.  
  259.  el paso será d=1 y el ángulo s=90 grados.
  260.  
  261.  ¿Qué es w?:
  262.  
  263.  En principio, suponemos que la nariz de la tortuga apunta hacia arriba.
  264.  w: Mover 1 adelante.Girar izqda 90 grados. Pintar linea.Girar otra vez.
  265.  Pintar línea,girar pintar y girar...... ¡un cuadrado!:
  266.  
  267.  
  268.    Tortuga en el paso 0:    /\
  269.  
  270.    F ......                 /|\
  271.                              |
  272.                              | .... posición anterior
  273.  
  274.    - ......                  >
  275.                              |
  276.                              |
  277.                              |
  278.  
  279.    F .....                   ----->
  280.                             |
  281.                             |
  282.                             |
  283.  
  284.    etc....
  285.  
  286.   Para ver lo que es p, lo mejor es pintarlo en una gran hoja de papel. Recor-
  287.  dad que ahora debéis sustituir los 4 lados del cuadrado por p. El resultado
  288.  es el llamado "isla cuadrática de Koch". Este fractal ha sido utilizado en
  289.  varias demos, como por ejemplo "Alpha-Omega" de los PMC (¡Hey Vanguard!, no
  290.  estaba nada mal!)
  291.  
  292.   Otro ejemplo:
  293.  
  294.   d=1, s=90 grados. Aplicar p 4 veces
  295.  
  296.  w: - F
  297.  p: F --> F + F - F - F + F
  298.  
  299.  
  300.   Ya que estamos con las demos, y para acabar con esta parte, el siguiente 
  301.  fractal es otro de los más utilizados en dichas demos:
  302.  
  303.  # define s=90  /*ie, el ángulo vale 90 grados*/
  304.  # define p=1   /* el paso vale 1
  305.  # define n=4 /* de ahora en adelante, n será el número de veces que hay
  306.                  que repetir p */
  307.  
  308.  w: F - F - F - F
  309.  p: F ---> F F - F - - F - F
  310.  
  311.   Nota: Estos  Fractales son los más  sencillos que  uno puede  encontrar. No
  312.  esperéis que resulten tan espectaculares como por ejemplo el conocido plasma
  313.  de la Hardwired. Estos Fractales son mucho más complejos y serán  explicados
  314.  bastante más adelante.
  315.  
  316.  Sistemas DOL: Edge & node rewriting 
  317.  -----------------------------------
  318.  
  319.   Siguiendo con los sistemas DOL, vamos a ver otras maneras de crear fractales
  320.  muy  similar a la anterior. Son los sistemas Node rewriting & Edge rewriting.
  321.  Me he permitido  la libertad de  dejar sus denominaciones en  Inglés, pues no
  322.  hay  una palabra  en Español  que los defina bien. Su  traducción viene a ser
  323.  algo así como Reescritura de ejes (Edge) y vértices (Nodes). 
  324.  
  325.   Como decía, es muy parecido al  anterior, sólo que en  esta ocasión  podemos
  326.  controlar más o menos (mas bien menos), el movimiento del fractal.
  327.  
  328.  Edge Rewriting:
  329.  
  330.   Dan lugar a las curvas FASS  (su traducción es irrelevante). La  misión de
  331.  estas curvas, es rellenar lo más posible todo el espacio, pero sin cruzarse.
  332.  
  333.   Es igual a las anteriores, sólo que en esta ocasión el movimiento hacia de-
  334.  lante de la tortuga, se ha diferenciado en dos. Es decir, ahora en lugar de
  335.  "F", encontrarás "Fr" y "Fl" (del Inglés Forward-Right & Forward-Left). ¡Pero
  336.  ojo!, NO SON DISTINTOS. SON EL MISMO MOVIMIENTO ....
  337.  
  338.   ... y se preguntarán... si son el mismo, ¿porqué llamarles de forma
  339.  distinta?.
  340.  
  341.   Veamos. Supongamos que tenemos una línea formada por 4 movimientos hacia
  342.  delante de la tortuga:
  343.                          1        2           3          4
  344.  F F F F  ....      --------->---------->----------->---------->
  345.  
  346.  Antes hacíamos por ejemplo:
  347.  
  348.  w: F F F F
  349.  p: F----> F + F -
  350.  
  351.   El problema, es que hemos modificado cada F de la línea iniciadora (w)
  352.  por otro movimiento, que ha actuado POR IGUAL sobre las cuatro partes de
  353.  la línea. ¿Qué ocurre si sólo deseamos que actúe sobre las dos primeras
  354.  partes?, o mejor, ¿y si queremos que sobre 1 y 3 actúe de forma contraria
  355.  a la que actúa sobre 2 y 4?.
  356.  
  357.   A la hora de rellenar espacios vacíos con las curvas FASS, es importante
  358.  rellenar espacios a derecha e izqda de la línea iniciadora. Veamos un ejem-
  359.  plo:
  360.  
  361.  #define p=1
  362.  #define s=60  /* 60 grados*/
  363.  #define n=4 /* repetimos 4 veces el proceso */
  364.  
  365.  w : Fl
  366.  p : Fl ---> Fl+Fr++Fr-Fl--FlFl-Fr+
  367.      Fr ---> -Fl+FrFr++Fr+Fl--Fl-Fr
  368.  
  369.  (Curva Hexagonal de Gosper)
  370.  
  371.   ¿Cómo actúa este Fractal?
  372.  
  373.  w: Dibujamos una línea hacia delante. Al denotarla por Fl significará
  374.     que el fractal que la sustituya debe moverse hacia si izqda:
  375.              
  376.               izqda de la linea
  377.              --------------------------            
  378.               derecha de la línea
  379.  
  380.   p: Sustituimos esta línea por otra, que si la representáis  veréis que
  381.      en efecto, se mueve hacia su izqda. Posteriormente, todas las líneas
  382.      que aparecen como Fr las sustituimos por un nuevo dibujo, que se
  383.      mueve hacia la derecha, y así sucesivamente ...
  384.  
  385.  ¿Cómo?, ¿que no os habéis enterado?. Vale, repetimos:
  386.  
  387.   Dibujamos una línea que llamaremos (Fl). A partir de ahora, donde aparezca
  388.  Fl, sustituiremos el primer mogollón, y donde aparezca Fr, el segundo.
  389.  ¿cómo que donde aparece Fr?, aparecerá al sustituir Fl por Fl+Fr++Fr... la
  390.  primera vez. Espero que ya esté más claro ...
  391.  
  392.   Desde luego, para moverse hacia la izqda o la derecha, podemos construir
  393.  cientos de dibujos, más o menos complicados. 
  394.  
  395.  Para acabar, éste es un ejemplo de movimiento a la izqda:
  396.  
  397.      Fl ---> FlFl+Fr+Fr-Fl-Fl+Fr+FrFl-Fr-FlFlFr+Fl-Fr-FlFl-Fr+FlFr+Fr
  398.              +Fl-Fl-FrFr+
  399.  
  400.   Así, si hacemos:
  401.  
  402.     w: Fl
  403.     p: Fl ---> FlFl+Fr+Fr-Fl-Fl+Fr+FrFl-Fr-FlFlFr+Fl-Fr-FlFl-Fr+FlFr+Fr
  404.              +Fl-Fl-FrFr+
  405.  
  406.        Fr ---> bla, bla...
  407.  
  408.      En la primera iteración, al sustituir Fl, obtendremos:
  409.  
  410.                             ----
  411.                            |    |
  412.                            |    |
  413.              ---- ---- ----     
  414.             |                   |
  415.             |                   |
  416.              ---- ----      ----
  417.                       |    |
  418.                       |    |
  419.                   ----           ----          Izqda de la línea
  420.                  |         |    |    |         iniciadora
  421.                  |         |    |    |        
  422.                   ----      ----
  423.                       |              |
  424.                       |              |     
  425.  Linea       ---- ----
  426.  original
  427.              derecha de la línea iniciadora (Por aquí estaría un fractal de
  428.                                              la forma Fr)   
  429.  
  430.  SEGUIREMOS INFORMANDO ...
  431.  
  432.   ¿Os ha gustado?, ¡Espero que sí!. Si os  gusta, pero  no  lo  acabáis  de
  433.  entender, escribirme, intentaré responder a todos.
  434.  Veamos algo ahora de matamáticas ...
  435.  
  436.  
  437.  NUMEROS COMPLEJOS:
  438.  -----------------
  439.  
  440.   Son muy utilizados en el diseño de fractales. Explicar de dónde salen y cómo
  441.  són, me parece algo aburrido, así que iré directamente al grano:
  442.  
  443.   Supongamos que tenemos dos puntos en la pantalla de nuestro querido Amiga,
  444.  que tienen por coordenadas (a,b) y (c,d). ¿Cómo operar con ellos?, ¿cómo
  445.  multiplicarlos....?. Necesitamos otra representación y esta viene a través
  446.  de los números complejos.
  447.  
  448.   Así pues, un punto de coordenadas (x,y) lo representaremos por x + yi.
  449.  
  450.  x = PARTE REAL
  451.  y = PARTE IMAGINARIA
  452.  
  453.  Podemos ahora operar con ellos:
  454.  
  455.  SUMA:
  456.  
  457.   (x + yi) + (a + bi) = (x+a + (y+b)i )
  458.  
  459.  RESTA:
  460.  
  461.   igual pero todo con menos
  462.  
  463.  MULTIPLICACION:
  464.  
  465.  (a+bi)*(c+di) = (a*c - b*d)+(b*c + a*d)i
  466.  
  467.   La división no es necesaria para nuestros fines.
  468.  
  469.  En C sería ...
  470.  
  471.   struct complex
  472.  {
  473.     float real,
  474.           imaginario;
  475.  }
  476.  
  477.  ....
  478.  
  479.  /* Veamos como multiplicar dos números complejos*/
  480.  
  481.   struct complex multiplicar(struct complex a,struct complex b)
  482.  {
  483.      struct complex c;
  484.  
  485.      c.real=a.real*b.real-a.imaginario*b.imaginario;
  486.      c.imaginario=a.imaginario*b.real+a.real*b.imaginario;
  487.      return c;
  488.   }
  489.  
  490.  ---------------------------------------------------------------------------- 
  491.  
  492. Y EN NUESTRO PROXIMO NUMERO ...
  493.  
  494.  * más sobre Sistemas DOL:Node rewriting 
  495.  * Fractales ¡TRIDIMENSIONALES!
  496.  * Estructuras en árbol
  497.  * Operaciones con matrices
  498.  
  499.  TODO ESTO Y MUCHO MAS, EN FANZINE NUMERO 2.
  500.  
  501.